package cart.api;

import cart.api.vo.CartItemGroupVo;
import cart.api.vo.CartItemVo;
import cart.model.cart.Cart;
import store.model.core.Store;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 购物车操作API接口
 * Created by Liang Wenxu on 2016/10/26.
 */
public interface CartApi {

    /**
     * 根据主键获取购物车数据
     * @param pk
     * @return
     */
    public Cart get(String pk);

    /**
     * 获取指定用户的购物车对象
     *  默认不包括已删除项，如需包括已删除项，需调用getUserCart(String userId, Boolean withDeletedItems)
     * @param userId
     * @return
     */
    public Cart getUserCart(String userId);

    /**
     * 获取指定用户的购物车对象（带过滤已删除数据开关）
     * @param userId
     * @param withDeletedItems
     * @return
     */
    public Cart getUserCart(String userId, Boolean withDeletedItems);

    /**
     * 列出用户下的购物车（预留，目前用户与购物车关系为1:1）
     * @param userId
     * @param withDeletedItems 是否包括已删除购物车项目开关
     * @return
     */
    public List<Cart> listUserCarts(String userId, Boolean withDeletedItems);

    /**
     * 取购物车 物品数
     * @param userId
     * @return
     */
    public Integer getCartSize(String userId);

    public Map<String, Object> saveCart(Cart cart);

    /**
     * 添加商品到指定购物车
     * @param params 参数清单，Map型不定参数，各参数值如下
     *      userId: String; 用户ID
     *      storeId: String; 店铺ID
     *      productId: String; 产品ID
     *      productFashId: String; 产品型号ID
     *      goodsId: String; 商品ID
     *      giftList: List<Map<String, Object>>; 礼品列表，Map中包括，id:礼品ID，count：礼品数量
     *      counts: 添加数量
     * @return Map
     *      error: int  错误代码 0-- 无错误，处理成功； 1-- 处理出错
     *      data: 返回数据 => 添加成功时，返回当次添加的CartItem对象
     */
    public Map<String, Object> addGoods(Map<String, Object> params);

    /**
     * 批量添加商品到指定购物车
     */
    public HashMap<String, Object> addGoodsToCart(Map<String, Object> params, String userId, HashMap<String, Object> rsMap);

    /**
     * 删除指定购物车下的指定商品（多条）
     * @param cartId 购物车ID
     * @param cartItemIds 购物车商品ID数组
     * @return 删除处理结果返回结果集:
     *      [ total: 总处理数据量,
     *          sucCount: 成功计数,
     *          faildCount: 失败计数,
     *          detials: [
     *              id: 处理记录ID
     *              force: 是否物理删除
     *              error: 处理结果，0为成功，1为错误
     *              msg: 处理信息
     *          ] 处理详情
     *      ]
     *
     */
    public Map<String, Object>  deleteItem(String cartId, String[] cartItemIds);

    /**
     * 物理删除指定购物车下的指定商品（多条）
     * @param cartId 购物车ID
     * @param cartItemIds 购物车商品ID数组
     * @return 删除处理结果返回结果集:
     *      [ total: 总处理数据量,
     *          sucCount: 成功计数,
     *          faildCount: 失败计数,
     *          detials: [
     *              id: 处理记录ID
     *              force: 是否物理删除
     *              error: 处理结果，0为成功，1为错误
     *              msg: 处理信息
     *          ] 处理详情
     *      ]
     *
     */
    public Map<String, Object>  deleteItemForce(String cartId, String[] cartItemIds);

    /**
     * 改变购物车商品购买件数
     * @param cartItemId
     * @param counts
     * @param areaCode 地区代码（国标），当为第三方商户商品时，传入该参数则会获取实时的库存
     * @return Map类型，包括：
     *      status: 处理状态，0-- 处理成功，1-- 失败代码，找不到购物车数据， 2-- 失败代码，找不到商品数据， 3-- 失败代码，保存数据出错
     */
    public Map cartItemCountsChg(String cartItemId, Long counts, String areaCode);

    /**
     * 查询指定的购物车商品状态
     * @param cartItemIds
     * @param areaCode
     * @return 返回Map: {
     *                      status: 状态
     *                      data: ArrayList<Map> -> [
     *                          {id: "1111", onSale: true|false, stockCount: int}
     *                          ] // 返回数据
     *                      }
     */
    public Map cartItemStockStatus(List<String> cartItemIds, String areaCode);

    /**
     * 还原已删除的购物车记录
     * @param cartItemIds
     * @return
     */
    public Map reduceDeledCartItems(List<String> cartItemIds);

    /**
     * 获取按店铺分组的购物车商品列表
     *
     * @param cartId            购物车id
     * @param groupType       分组方式，1-- 按商户分组，当前只支持按商户分组
     * @param withStoreDetail 是否包含店铺详情
     * @param refreshStatus: Boolean 是否刷新规格的实时状态（主要针对第三方商品）
     * @param areaCode: String 当refreshStatus为true时不能为空
     * @param cartItemIds     不为空时，只展示存在给出ID列表中的数据
     * @param tmpCartItems    不为空时，以tmpCartItems中的购买数量覆盖
     * @param organizationCode     合作企业组织代码
     * @return Map<String, CartStoreInfoVo> 返回集合中将以店铺的storeId作为索引
     */
    public List<CartItemGroupVo> getCartItemGroups(String cartId, String groupType, Boolean withStoreDetail,
                                                   Boolean refreshStatus, String areaCode, List<String> cartItemIds,
                                                    List<Map<String, Object>> tmpCartItems, String organizationCode);

    /**
     * 查询第三方库存状态
     * @param cartItemVoList
     * @param areaNodeList
     * @param store
     * @return
     */
    public List<CartItemVo> queryStockState(List<CartItemVo> cartItemVoList, Map<Integer, String> areaNodeList,
                                            Store store);

    /**
     * 购物车展示商品排序
     *
     * @param cartItemGroups
     * @return
     */
    public List<CartItemGroupVo> cartItemGroupsSort(List<CartItemGroupVo> cartItemGroups);

    public String toString();
}
